小编典典

os.environ['foo'] 什么时候不匹配 os.getenv('foo')?

all

我有一个小型 Python 应用程序,通过 启动subprocess.Popen,它以环境变量的形式接受一些参数。我通过将环境结构传递给Popen调用来做到这一点。然后程序通过 读取变量os.getenv

或者更确切地说,它曾经以这种方式阅读它们。在 Windows 上,它运行良好。但是在我们的 FreeBSD 服务器上,os.getenv返回None我们传入的所有参数。奇怪的是,os.environ它的值很好——事实上,只需将所有os.getenv('foo')调用切换到两个平台os.environ['foo']上都可以正常工作。

为什么这些值不同?什么时候一个比另一个合适?


阅读 164

收藏
2022-05-06

共1个答案

小编典典

os.environ在导入os模块时创建,除非直接修改,否则不会反映之后发生的环境更改。然而,有趣的是,os.getenv()实际上也没有获得最新的环境变量,至少在 CPython 中没有。你看,在 CPython 中,os.getenv()显然只是一个包装器os.environ.get()(参见http://hg.python.org/cpython/file/6671c5039e15/Lib/os.py#l646)。因此,似乎与所述实现一起使用的主要原因os.getenv()是,当您希望在os.environ‘ 的键中找不到环境变量名称而不是KeyError抛出 a 或任何东西时返回默认值,并且您想保存一些人物。

FreeBSD 上的实现完全有可能有一些奇怪的噱头导致它的行为不同,但我不确定为什么会这样。os.py如果可以,请查看您使用的一台 FreeBSD 机器上的副本。

2022-05-06